From: Florian Müllner Date: Sat, 14 Mar 2020 21:01:00 +0000 (+0100) Subject: networkAgent: Make searching VPN binaries asynchronous X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~751^2^2~128 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=b97fc02e57da616424952e9c3cbef25525524c5d;p=gnome-shell.git networkAgent: Make searching VPN binaries asynchronous Doing blocking IO in a graphical UI is bad, doing it in the compositor is much much worse. So even if handling VPN requests is a relatively rare event, doing it asynchronously is better. https://gitlab.gnome.org/GNOME/gnome-shell/issues/2386 --- diff --git a/js/ui/components/networkAgent.js b/js/ui/components/networkAgent.js index c0f00f5a2..05d52ee86 100644 --- a/js/ui/components/networkAgent.js +++ b/js/ui/components/networkAgent.js @@ -4,13 +4,15 @@ const { Clutter, Gio, GLib, GObject, NM, Pango, Shell, St } = imports.gi; const Signals = imports.signals; -const Config = imports.misc.config; const Dialog = imports.ui.dialog; const Main = imports.ui.main; const MessageTray = imports.ui.messageTray; const ModalDialog = imports.ui.modalDialog; const ShellEntry = imports.ui.shellEntry; +Gio._promisify(Shell.NetworkAgent.prototype, + 'search_vpn_plugin', 'search_vpn_plugin_finish'); + const VPN_UI_GROUP = 'VPN Plugin UI'; var NetworkSecretDialog = GObject.registerClass( @@ -758,11 +760,11 @@ var NetworkAgent = class { } } - _vpnRequest(requestId, connection, hints, flags) { + async _vpnRequest(requestId, connection, hints, flags) { let vpnSetting = connection.get_setting_vpn(); let serviceType = vpnSetting.service_type; - let binary = this._findAuthBinary(serviceType); + let binary = await this._findAuthBinary(serviceType); if (!binary) { log('Invalid VPN service type (cannot find authentication binary)'); @@ -778,11 +780,15 @@ var NetworkAgent = class { this._vpnRequests[requestId] = vpnRequest; } - _findAuthBinary(serviceType) { - const plugin = NM.VpnPluginInfo.new_search_file(null, serviceType); + async _findAuthBinary(serviceType) { + let plugin; - if (plugin === null) + try { + plugin = await this._native.search_vpn_plugin(serviceType); + } catch (e) { + logError(e); return null; + } const fileName = plugin.get_auth_dialog(); if (!GLib.file_test(fileName, GLib.FileTest.IS_EXECUTABLE)) {